package base.thread_JUC.demo01;

import java.util.concurrent.atomic.AtomicInteger;


/**
 * volatile 不能保证原子性，因此原子操作应当使用JUC里面的 java.util.concurrent.atomic.Atomicxxx 相关的API保证原子性
 */
public class Client4 {
    // 使用原子变量,解决多线程下安全问题
    private AtomicInteger atomicInteger = new AtomicInteger() ;

    public void add(){
        atomicInteger.getAndIncrement();
//        atomicInteger.compareAndSet(atomicInteger.get(),atomicInteger.get()+1);//没有CAS，执行不成功就放弃操作
    }

    public static void main(String[] args) {
        Client4 client = new Client4();

        for (int i = 0; i < 20; i++) {
            new Thread(()->{
                for (int j = 0; j < 1000; j++) {
                    // 在多线程环境下 AtomicInteger 如何保障了+1的原子性操作？答案是：AtomicInteger 底层采用的 CAS 算法 和 volatile 修饰的值可见性
                    //System.out.println(Thread.currentThread().getName()+" += "+client.atomicInteger.get());
                    client.add();
                }
            }, String.valueOf(i)).start();
        }

        while (Thread.activeCount() > 2) {
            Thread.yield();
        }
        System.out.println("多线程环境下，计算结果一致："+client.atomicInteger);

    }
}
